/*
 * interfaz.java
 *
 * Created on 1 de junio de 2008, 16:11
 */
package View;

import Control.InterfaceControl;
import Jama.Matrix;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import matrices.centro.Clase;

/**
 * Representa la pantalla principal de la aplicación
 * 
 * @author Jose Antonio Gonzalez, Ambrin Chaudhary
 */
public class PantallaGrafica extends javax.swing.JFrame implements InterfaceVista {

    private InterfaceControl controlador;
    private InterfaceVista pantallaEvaluar = new Evaluar();
    private InterfaceVista pantallaAjustarLloyd = new AjustarLloyd();
    private InterfaceVista pantallaAjustarCV = new AjustarCV();
    private InterfaceVista pantallaAjustarSOM = new AjustarSOM();
    private InterfaceVista pantallaAjustaKMedias = new AjustarKmedias();
    //prueba para la tabla
    protected DefaultTableModel modelo;

    /**
     * Registra el controlador    
     * @param controlador
     */
    public void registerControl(InterfaceControl _controlador) {

        this.controlador = _controlador;

        //registro el controlador para el resto de pantallas
        this.pantallaEvaluar.registerControl(controlador);
        this.pantallaAjustarCV.registerControl(controlador);
        this.pantallaAjustarLloyd.registerControl(controlador);
        this.pantallaAjustaKMedias.registerControl(controlador);
        this.pantallaAjustarSOM.registerControl(controlador);
    }

    /** Creates new form interfaz */
    public PantallaGrafica() {
        initComponents();

        this.setVisible(true);
        this.setTitle("IAIC: Práctica 2");

        //acciones de los menús
        jCargarArchivoACuantizar2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                solicitaFicheroACuantizar();
            }
        });

        jCargarArchivoCuantizado2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                solicitaFicheroCuantizado();
            }
        });

        jAjustar2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                ajustar();
            }
        });

        jEvaluacion2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                evaluar();
            }
        });

        jSalir2.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        this.jNombreCuantizado.setEditable(false);
        this.jNombreFichero.setEditable(false);

        tablaResultados.setVisible(false);

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane4 = new javax.swing.JScrollPane();
        jTable2 = new javax.swing.JTable();
        jPanel1 = new javax.swing.JPanel();
        rb_kmedias = new javax.swing.JRadioButton();
        rb_lloyd = new javax.swing.JRadioButton();
        btn_ajustar = new javax.swing.JButton();
        btn_evaluar = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        rb_som = new javax.swing.JRadioButton();
        jLabel3 = new javax.swing.JLabel();
        btn_cargarFichero = new javax.swing.JButton();
        jLabel5 = new javax.swing.JLabel();
        jNombreFichero = new javax.swing.JTextField();
        btn_reiniciar = new javax.swing.JButton();
        jLabel8 = new javax.swing.JLabel();
        jMenuBar = new javax.swing.JMenuBar();
        mArchivo = new javax.swing.JMenu();
        jCargarArchivo = new javax.swing.JMenu();
        jCargarArchivoACuantizar = new javax.swing.JMenuItem();
        jCargarArchivoCuantizado = new javax.swing.JMenuItem();
        jSeparator2 = new javax.swing.JSeparator();
        jAjustar = new javax.swing.JMenuItem();
        jEvaluacion = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JSeparator();
        jSalir = new javax.swing.JMenuItem();
        jScrollPane2 = new javax.swing.JScrollPane();
        jScrollPane3 = new javax.swing.JScrollPane();
        tablaResultados = new javax.swing.JTable();
        jMenuBar1 = new javax.swing.JMenuBar();
        mArchivo1 = new javax.swing.JMenu();
        jCargarArchivo1 = new javax.swing.JMenu();
        jCargarArchivoACuantizar1 = new javax.swing.JMenuItem();
        jCargarArchivoCuantizado1 = new javax.swing.JMenuItem();
        jSeparator3 = new javax.swing.JSeparator();
        jAjustar1 = new javax.swing.JMenuItem();
        jEvaluacion1 = new javax.swing.JMenuItem();
        jSeparator4 = new javax.swing.JSeparator();
        jSalir1 = new javax.swing.JMenuItem();
        jSeparator7 = new javax.swing.JSeparator();
        jPanel2 = new javax.swing.JPanel();
        btn_cargarCuantizado = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jNombreCuantizado = new javax.swing.JTextField();
        jLabel7 = new javax.swing.JLabel();
        jSeparator9 = new javax.swing.JSeparator();
        jLabel4 = new javax.swing.JLabel();
        jMenuBar2 = new javax.swing.JMenuBar();
        mArchivo2 = new javax.swing.JMenu();
        jCargarArchivo2 = new javax.swing.JMenu();
        jCargarArchivoACuantizar2 = new javax.swing.JMenuItem();
        jCargarArchivoCuantizado2 = new javax.swing.JMenuItem();
        jSeparator5 = new javax.swing.JSeparator();
        jAjustar2 = new javax.swing.JMenuItem();
        jEvaluacion2 = new javax.swing.JMenuItem();
        jSeparator6 = new javax.swing.JSeparator();
        jSalir2 = new javax.swing.JMenuItem();
        jMenuBar3 = new javax.swing.JMenuBar();
        mArchivo3 = new javax.swing.JMenu();
        jCargarArchivo3 = new javax.swing.JMenu();
        jCargarArchivoACuantizar3 = new javax.swing.JMenuItem();
        jCargarArchivoCuantizado3 = new javax.swing.JMenuItem();
        jSeparator8 = new javax.swing.JSeparator();
        jAjustar3 = new javax.swing.JMenuItem();
        jEvaluacion3 = new javax.swing.JMenuItem();
        jSeparator10 = new javax.swing.JSeparator();
        jSalir3 = new javax.swing.JMenuItem();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        jScrollPane5 = new javax.swing.JScrollPane();
        jTable3 = new javax.swing.JTable();
        jMenuBar4 = new javax.swing.JMenuBar();
        mArchivo4 = new javax.swing.JMenu();
        jCargarArchivo4 = new javax.swing.JMenu();
        jCargarArchivoACuantizar4 = new javax.swing.JMenuItem();
        jCargarArchivoCuantizado4 = new javax.swing.JMenuItem();
        jSeparator11 = new javax.swing.JSeparator();
        jAjustar4 = new javax.swing.JMenuItem();
        jEvaluacion4 = new javax.swing.JMenuItem();
        jSeparator12 = new javax.swing.JSeparator();
        jSalir4 = new javax.swing.JMenuItem();

        jTable2.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane4.setViewportView(jTable2);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

        rb_kmedias.setText("K-Medias");
        rb_kmedias.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rb_kmediasActionPerformed(evt);
            }
        });

        rb_lloyd.setText("LVQ Supervisado");
        rb_lloyd.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rb_lloydActionPerformed(evt);
            }
        });

        btn_ajustar.setText("Ajustar");
        btn_ajustar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_ajustarActionPerformed(evt);
            }
        });

        btn_evaluar.setText("Evaluar");
        btn_evaluar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_evaluarActionPerformed(evt);
            }
        });

        jLabel1.setText("- Seleccione el algoritmo de aprendizaje:");

        rb_som.setText("Self Organizinf Maps");
        rb_som.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rb_somActionPerformed(evt);
            }
        });

        jLabel3.setText("ALGORITMOS");

        btn_cargarFichero.setText("Cargar Fichero");
        btn_cargarFichero.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_cargarFicheroActionPerformed(evt);
            }
        });

        jLabel5.setText("Nombre del fichero");

        jNombreFichero.setDisabledTextColor(new java.awt.Color(204, 204, 204));

        btn_reiniciar.setText("Reiniciar");
        btn_reiniciar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_reiniciarActionPerformed(evt);
            }
        });

        jLabel8.setText("- Cargar un fichero para cuantizar");

        org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .add(jLabel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 430, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(161, Short.MAX_VALUE))
            .add(jPanel1Layout.createSequentialGroup()
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(74, 74, 74)
                        .add(jLabel5, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 151, Short.MAX_VALUE)
                        .add(36, 36, 36))
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(48, 48, 48)
                        .add(btn_ajustar, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 115, Short.MAX_VALUE)
                        .add(98, 98, 98))
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(24, 24, 24)
                        .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(jLabel8, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 224, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                            .add(jLabel1))
                        .add(13, 13, 13)))
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jPanel1Layout.createSequentialGroup()
                        .add(btn_evaluar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 122, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                        .add(59, 59, 59)
                        .add(btn_reiniciar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 100, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
                        .add(org.jdesktop.layout.GroupLayout.LEADING, btn_cargarFichero, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .add(org.jdesktop.layout.GroupLayout.LEADING, jNombreFichero, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 141, Short.MAX_VALUE)))
                .addContainerGap(59, Short.MAX_VALUE))
            .add(jPanel1Layout.createSequentialGroup()
                .add(173, 173, 173)
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(rb_kmedias)
                    .add(rb_lloyd)
                    .add(rb_som))
                .addContainerGap(305, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .add(jLabel3, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 23, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel8)
                    .add(btn_cargarFichero))
                .add(5, 5, 5)
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel5)
                    .add(jNombreFichero, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .add(30, 30, 30)
                .add(jLabel1)
                .add(18, 18, 18)
                .add(rb_kmedias)
                .add(18, 18, 18)
                .add(rb_lloyd)
                .add(18, 18, 18)
                .add(rb_som, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 23, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(30, 30, 30)
                .add(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(btn_ajustar, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 23, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(btn_evaluar)
                    .add(btn_reiniciar)))
        );

        mArchivo.setText("Archivo");

        jCargarArchivo.setText("Cargar Archivo");

        jCargarArchivoACuantizar.setText("a cuantizar");
        jCargarArchivo.add(jCargarArchivoACuantizar);

        jCargarArchivoCuantizado.setText("cuantizado");
        jCargarArchivo.add(jCargarArchivoCuantizado);

        mArchivo.add(jCargarArchivo);
        mArchivo.add(jSeparator2);

        jAjustar.setText("Ajustar");
        mArchivo.add(jAjustar);

        jEvaluacion.setText("Evaluar");
        mArchivo.add(jEvaluacion);
        mArchivo.add(jSeparator1);

        jSalir.setText("Salir");
        mArchivo.add(jSalir);

        jMenuBar.add(mArchivo);

        tablaResultados.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        tablaResultados.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_NEXT_COLUMN);
        jScrollPane3.setViewportView(tablaResultados);

        jScrollPane2.setViewportView(jScrollPane3);

        mArchivo1.setText("Archivo");

        jCargarArchivo1.setText("Cargar Archivo");

        jCargarArchivoACuantizar1.setText("a cuantizar");
        jCargarArchivo1.add(jCargarArchivoACuantizar1);

        jCargarArchivoCuantizado1.setText("cuantizado");
        jCargarArchivo1.add(jCargarArchivoCuantizado1);

        mArchivo1.add(jCargarArchivo1);
        mArchivo1.add(jSeparator3);

        jAjustar1.setText("Ajustar");
        mArchivo1.add(jAjustar1);

        jEvaluacion1.setText("Evaluar");
        mArchivo1.add(jEvaluacion1);
        mArchivo1.add(jSeparator4);

        jSalir1.setText("Salir");
        mArchivo1.add(jSalir1);

        jMenuBar1.add(mArchivo1);

        btn_cargarCuantizado.setText("Cargar Cuantizado");
        btn_cargarCuantizado.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_cargarCuantizadoActionPerformed(evt);
            }
        });

        jLabel2.setText("CUANTIZACIÓN VECTORIAL POR LVQ NO SUPERVISADO");

        jLabel6.setText("Nombre del fichero");

        jLabel7.setText(" Cargar un fichero cuantizado: ");

        org.jdesktop.layout.GroupLayout jPanel2Layout = new org.jdesktop.layout.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel2Layout.createSequentialGroup()
                .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(jPanel2Layout.createSequentialGroup()
                        .addContainerGap()
                        .add(jLabel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 346, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(jPanel2Layout.createSequentialGroup()
                        .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                            .add(jPanel2Layout.createSequentialGroup()
                                .add(41, 41, 41)
                                .add(jLabel7, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 179, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                                .add(56, 56, 56))
                            .add(org.jdesktop.layout.GroupLayout.TRAILING, jPanel2Layout.createSequentialGroup()
                                .addContainerGap(org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .add(jLabel6)
                                .add(91, 91, 91)))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING, false)
                            .add(jNombreCuantizado)
                            .add(btn_cargarCuantizado, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 139, Short.MAX_VALUE))))
                .addContainerGap(186, Short.MAX_VALUE))
            .add(jSeparator9, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 601, Short.MAX_VALUE)
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(jPanel2Layout.createSequentialGroup()
                .add(jLabel2)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING)
                    .add(jLabel7)
                    .add(btn_cargarCuantizado))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanel2Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(jLabel6)
                    .add(jNombreCuantizado, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(jSeparator9, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 17, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        jLabel4.setText("RESULTADOS");

        mArchivo2.setText("Archivo");

        jCargarArchivo2.setText("Cargar Archivo");

        jCargarArchivoACuantizar2.setText("a cuantizar");
        jCargarArchivo2.add(jCargarArchivoACuantizar2);

        jCargarArchivoCuantizado2.setText("cuantizado");
        jCargarArchivo2.add(jCargarArchivoCuantizado2);

        mArchivo2.add(jCargarArchivo2);
        mArchivo2.add(jSeparator5);

        jAjustar2.setText("Ajustar");
        mArchivo2.add(jAjustar2);

        jEvaluacion2.setText("Evaluar");
        mArchivo2.add(jEvaluacion2);
        mArchivo2.add(jSeparator6);

        jSalir2.setText("Salir");
        mArchivo2.add(jSalir2);

        jMenuBar2.add(mArchivo2);

        mArchivo3.setText("Archivo");

        jCargarArchivo3.setText("Cargar Archivo");

        jCargarArchivoACuantizar3.setText("a cuantizar");
        jCargarArchivo3.add(jCargarArchivoACuantizar3);

        jCargarArchivoCuantizado3.setText("cuantizado");
        jCargarArchivo3.add(jCargarArchivoCuantizado3);

        mArchivo3.add(jCargarArchivo3);
        mArchivo3.add(jSeparator8);

        jAjustar3.setText("Ajustar");
        mArchivo3.add(jAjustar3);

        jEvaluacion3.setText("Evaluar");
        mArchivo3.add(jEvaluacion3);
        mArchivo3.add(jSeparator10);

        jSalir3.setText("Salir");
        mArchivo3.add(jSalir3);

        jMenuBar3.add(mArchivo3);

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(jTable1);

        jTable3.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane5.setViewportView(jTable3);

        mArchivo4.setText("Archivo");

        jCargarArchivo4.setText("Cargar Archivo");

        jCargarArchivoACuantizar4.setText("a cuantizar");
        jCargarArchivo4.add(jCargarArchivoACuantizar4);

        jCargarArchivoCuantizado4.setText("cuantizado");
        jCargarArchivo4.add(jCargarArchivoCuantizado4);

        mArchivo4.add(jCargarArchivo4);
        mArchivo4.add(jSeparator11);

        jAjustar4.setText("Ajustar");
        mArchivo4.add(jAjustar4);

        jEvaluacion4.setText("Evaluar");
        mArchivo4.add(jEvaluacion4);
        mArchivo4.add(jSeparator12);

        jSalir4.setText("Salir");
        mArchivo4.add(jSalir4);

        jMenuBar4.add(mArchivo4);

        setJMenuBar(jMenuBar4);

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .addContainerGap()
                .add(layout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jSeparator7)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, layout.createSequentialGroup()
                        .add(10, 10, 10)
                        .add(jLabel4, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 387, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jPanel1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .add(org.jdesktop.layout.GroupLayout.LEADING, jPanel2, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(18, Short.MAX_VALUE))
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .addContainerGap(49, Short.MAX_VALUE)
                .add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 537, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(43, 43, 43))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(org.jdesktop.layout.GroupLayout.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .add(jPanel2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 100, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jPanel1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, 25, Short.MAX_VALUE)
                .add(jSeparator7, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 10, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(jLabel4)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.UNRELATED)
                .add(jScrollPane2, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 190, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .add(6, 6, 6))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents
    private void rb_kmediasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rb_kmediasActionPerformed
        // TODO add your handling code here:

        this.rb_kmedias.setSelected(true);

        this.rb_lloyd.setSelected(false);
        this.rb_som.setSelected(false);


        //informar al controlador
        controlador.setAlgoritmo(2);

        //desabilito los radio buttons 
        this.rb_kmedias.setEnabled(false);
        this.rb_lloyd.setEnabled(false);
        this.rb_som.setEnabled(false);



}//GEN-LAST:event_rb_kmediasActionPerformed

    private void rb_lloydActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rb_lloydActionPerformed
        // TODO add your handling code here:
        this.rb_lloyd.setSelected(true);
        this.rb_kmedias.setSelected(false);
        this.rb_som.setSelected(false);


        //informar al controlador
        controlador.setAlgoritmo(3);

        //desabilito los radio buttons 
        this.rb_kmedias.setEnabled(false);
        this.rb_lloyd.setEnabled(false);
        this.rb_som.setEnabled(false);
}//GEN-LAST:event_rb_lloydActionPerformed

private void btn_ajustarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_ajustarActionPerformed
// TODO add your handling code here:
    this.ajustar();
}//GEN-LAST:event_btn_ajustarActionPerformed

private void btn_evaluarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_evaluarActionPerformed
// TODO add your handling code here:
    this.evaluar();
}//GEN-LAST:event_btn_evaluarActionPerformed

private void rb_somActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rb_somActionPerformed

    //desactivar los otros
    this.rb_kmedias.setSelected(false);
    this.rb_lloyd.setSelected(false);

    //activar el seleccionado
    this.rb_som.setSelected(true);

    //informar al controlador
    controlador.setAlgoritmo(4);

    //desabilito los radio buttons 
    this.rb_kmedias.setEnabled(false);
    this.rb_lloyd.setEnabled(false);
    this.rb_som.setEnabled(false);
}//GEN-LAST:event_rb_somActionPerformed

private void btn_cargarFicheroActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_cargarFicheroActionPerformed
    solicitaFicheroACuantizar();

}//GEN-LAST:event_btn_cargarFicheroActionPerformed

private void btn_cargarCuantizadoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_cargarCuantizadoActionPerformed

    solicitaFicheroCuantizado();
}//GEN-LAST:event_btn_cargarCuantizadoActionPerformed

private void btn_reiniciarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_reiniciarActionPerformed

    //habilito los radio buttons 
    this.rb_kmedias.setEnabled(true);
    this.rb_lloyd.setEnabled(true);
    this.rb_som.setEnabled(true);

    //deselecciono todos los radiobuttons
    this.rb_kmedias.setSelected(false);
    this.rb_lloyd.setSelected(false);
    this.rb_som.setSelected(false);

    //se borra el fichero que habíamos cargado
    this.jNombreFichero.setText("");

    //informar al controlador
    controlador.reiniciar();

    //borro la tabla de resultados
    tablaResultados.setVisible(false);
}//GEN-LAST:event_btn_reiniciarActionPerformed

    //===============================================================================================
    //                  métodos de la interfaz
    //===============================================================================================
    public void solicitaFicheroACuantizar() {
        try {
            //comprobar que haya algun algoritmo seleccionado
            if (this.rb_kmedias.isSelected() || this.rb_lloyd.isSelected() || this.rb_som.isSelected()) {
                JFileChooser fc = new JFileChooser(".");
                fc.showOpenDialog(null);

                File fichero = fc.getSelectedFile();

                controlador.cargarFichACuantizar(fichero);

                //mostramos el nombre del fichero cargado
                this.jNombreFichero.setText(fichero.getName());
            } else {
                this.muestraError("Antes seleccione un algoritmo");
            }

        } catch (NullPointerException e) {
            System.out.println("No se ha cargado el fichero");
        }
    }

    public void solicitaFicheroCuantizado() {
        try {


            JFileChooser fc = new JFileChooser(".");
            fc.showOpenDialog(null);

            File fichero = fc.getSelectedFile();

            controlador.cargarFichCuantizado(fichero);

            //mostramos el nombre del fichero cargado
            this.jNombreCuantizado.setText(fichero.getName());


        } catch (NullPointerException e) {
            System.out.println("No se ha cargado el fichero");
        }
    }

    public void ajustar() {

        if (controlador.esPosibleAjustar()) {

            if (this.rb_lloyd.isSelected()) {
                this.pantallaAjustarLloyd.mostrarVentana();
            } else if (this.rb_kmedias.isSelected()) {
                this.pantallaAjustaKMedias.mostrarVentana();
            } else if (this.rb_som.isSelected()) {
                this.pantallaAjustarSOM.mostrarVentana();
            } else {
                this.muestraError("seleccionar un algoritmo");
            }

        }

    }

    public void evaluar() {
        if (controlador.esPosibleEvaluar()) {
            this.pantallaEvaluar.mostrarVentana();

        }

    }

    /**
     * Abre un JOptionPane y muestra el error que se ha producido
     * @param mensajeError 
     */
    public void muestraError(String mensajeError) {
        JOptionPane.showMessageDialog(this,
                mensajeError, "ERROR: ",
                JOptionPane.ERROR_MESSAGE);
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btn_ajustar;
    private javax.swing.JButton btn_cargarCuantizado;
    private javax.swing.JButton btn_cargarFichero;
    private javax.swing.JButton btn_evaluar;
    private javax.swing.JButton btn_reiniciar;
    private javax.swing.JMenuItem jAjustar;
    private javax.swing.JMenuItem jAjustar1;
    private javax.swing.JMenuItem jAjustar2;
    private javax.swing.JMenuItem jAjustar3;
    private javax.swing.JMenuItem jAjustar4;
    private javax.swing.JMenu jCargarArchivo;
    private javax.swing.JMenu jCargarArchivo1;
    private javax.swing.JMenu jCargarArchivo2;
    private javax.swing.JMenu jCargarArchivo3;
    private javax.swing.JMenu jCargarArchivo4;
    private javax.swing.JMenuItem jCargarArchivoACuantizar;
    private javax.swing.JMenuItem jCargarArchivoACuantizar1;
    private javax.swing.JMenuItem jCargarArchivoACuantizar2;
    private javax.swing.JMenuItem jCargarArchivoACuantizar3;
    private javax.swing.JMenuItem jCargarArchivoACuantizar4;
    private javax.swing.JMenuItem jCargarArchivoCuantizado;
    private javax.swing.JMenuItem jCargarArchivoCuantizado1;
    private javax.swing.JMenuItem jCargarArchivoCuantizado2;
    private javax.swing.JMenuItem jCargarArchivoCuantizado3;
    private javax.swing.JMenuItem jCargarArchivoCuantizado4;
    private javax.swing.JMenuItem jEvaluacion;
    private javax.swing.JMenuItem jEvaluacion1;
    private javax.swing.JMenuItem jEvaluacion2;
    private javax.swing.JMenuItem jEvaluacion3;
    private javax.swing.JMenuItem jEvaluacion4;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JMenuBar jMenuBar;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuBar jMenuBar2;
    private javax.swing.JMenuBar jMenuBar3;
    private javax.swing.JMenuBar jMenuBar4;
    private javax.swing.JTextField jNombreCuantizado;
    private javax.swing.JTextField jNombreFichero;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JMenuItem jSalir;
    private javax.swing.JMenuItem jSalir1;
    private javax.swing.JMenuItem jSalir2;
    private javax.swing.JMenuItem jSalir3;
    private javax.swing.JMenuItem jSalir4;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JScrollPane jScrollPane5;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JSeparator jSeparator10;
    private javax.swing.JSeparator jSeparator11;
    private javax.swing.JSeparator jSeparator12;
    private javax.swing.JSeparator jSeparator2;
    private javax.swing.JSeparator jSeparator3;
    private javax.swing.JSeparator jSeparator4;
    private javax.swing.JSeparator jSeparator5;
    private javax.swing.JSeparator jSeparator6;
    private javax.swing.JSeparator jSeparator7;
    private javax.swing.JSeparator jSeparator8;
    private javax.swing.JSeparator jSeparator9;
    private javax.swing.JTable jTable1;
    private javax.swing.JTable jTable2;
    private javax.swing.JTable jTable3;
    private javax.swing.JMenu mArchivo;
    private javax.swing.JMenu mArchivo1;
    private javax.swing.JMenu mArchivo2;
    private javax.swing.JMenu mArchivo3;
    private javax.swing.JMenu mArchivo4;
    private javax.swing.JRadioButton rb_kmedias;
    private javax.swing.JRadioButton rb_lloyd;
    private javax.swing.JRadioButton rb_som;
    private javax.swing.JTable tablaResultados;
    // End of variables declaration//GEN-END:variables

    /**
     * Rellena una tabla a partir con los datos que previamente se han actualizado,
     * ajustado según el algoritmo correspondiente, y evaluado
     * @param datos : centro y clases 
     */
    public void muestraResultado(Vector<Clase> clases) {

        modelo = new DefaultTableModel();

        if (clases.size() > 0) {
            //se supone que siempre tenemos el mismo nº de columnas
            int numColumnas = clases.get(0).getCentro().getColumnDimension() + 1;

            //1º fila de la tabla: nombre de las columnas
            String titColumna[] = new String[numColumnas];
            titColumna[0] = " ";
            modelo.addColumn(titColumna[0]);
            for (int i = 1; i < titColumna.length; i++) {
                titColumna[i] = "Elemento " + i;
                modelo.addColumn(titColumna[i]);
            }

            //para cada clase, mostraremos su centro y sus muestras

            for (int indice = 0; indice < clases.size(); indice++) {

                Matrix centro = clases.get(indice).getCentro();
                ArrayList<Matrix> vectores = clases.get(indice).getElements();

                //resto de filas: los datos a mostrar: 
                String fila[] = new String[numColumnas];
                //la 2º fila muestra el valor del centro
                fila[0] = "Centro " + indice;
                for (int i = 1; i < numColumnas; i++) {
                    fila[i] = String.valueOf(centro.get(0, i - 1));
                }

                modelo.addRow(fila);
                //resto de las columnas: los datos
                for (int i = 1; i < vectores.size() + 1; i++) {
                    Matrix datosFila = vectores.get(i - 1);
                    fila = new String[datosFila.getColumnDimension() + 1];
                    for (int j = 0; j < fila.length; j++) {

                        if (j == 0) {
                            fila[j] = "Muestra " + String.valueOf(i);
                        //fila[j] = "Muestra " + ;
                        } else {
                            fila[j] = String.valueOf(datosFila.get(0, j - 1));

                        }
                    }
                    modelo.addRow(fila);

                }

            }//for clases


            tablaResultados.setModel(modelo);
            tablaResultados.setVisible(true);
        // jScrollPane1.setViewportView(tablaResultados);

        }//if

    }

    /**
     * Muestra esta por pantalla 
     */
    public void mostrarVentana() {
        this.setVisible(true);
    }
}
